package com.chl.jdk8.stream;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class StreamCollect {
	public static void main(String[] args) {
		final int NUM = 14;
		List<Persion> PersionList = new ArrayList<>(NUM);
		String[] names = { "小张", "小龙", "小牛", "小猪", "小黑", "小红", "小白" };
		for (int i = 0; i < 5; i++) {
			// 添加5个19岁的随机性别和名字的小朋友
			PersionList.add(new Persion(19, (int) (Math.random() * 2), names[(int) (Math.random() * names.length)]));
		}
		for (int i = 5; i < 8; i++) {
			// 添加3个31岁的随机性别和名字的小朋友
			PersionList.add(new Persion(31, (int) (Math.random() * 2), names[(int) (Math.random() * names.length)]));
		}
		for (int i = 8; i < NUM; i++) {
			// 添加6个22岁的随机性别和名字的小朋友
			PersionList.add(new Persion(22, (int) (Math.random() * 2), names[(int) (Math.random() * names.length)]));
		}

		System.out.println(PersionList.size());
		// collectingAndThen先对stream里的元素进行collecting，之后再对结果进行操作，
		// 下面的结果是一个map,对map计算元素数目
		System.out.println("分组数目：");
		Integer groupCount = PersionList.stream()
				.collect(Collectors.collectingAndThen(Collectors.groupingBy(Persion::getName), Map::size));
		System.out.println(groupCount);
		System.out.println("-------------------------------------");

		// 按照名字分组
		System.out.println("按照名字分组");
		System.out.println(PersionList.stream().collect(Collectors.groupingBy(Persion::getName)));
		System.out.println("-------------------------------------");

		// 按照名字分组(分组的结果是一个map)，并统计每一个分组(map中的每一个value)中的元素数目
		System.out.println("统计每一个分组(map中的每一个value)中的元素数目");
		System.out
				.println(PersionList.stream().collect(Collectors.groupingBy(Persion::getName, Collectors.counting())));
		System.out.println("-------------------------------------");
		
		
		// 按照名字分组(分组的结果是一个map)，并取出每一组的最大值
		System.out.println("取出每一组的最大值");
		System.out.println(PersionList.stream()
				.collect(Collectors.groupingBy(Persion::getName, Collectors.maxBy((Persion o1, Persion o2) -> o1.getAge() - o2.getAge()))));
	}
}
